package br.pb.sistcomp.dao;

import br.pb.sistcomp.entity.Lance;
import br.pb.sistcomp.entity.Venda;
import br.pb.sistcomp.exception.ErroAoRemoverException;
import br.pb.sistcomp.exception.ErroAoSalvarException;
import br.pb.sistcomp.util.HibernateUtil;
import java.util.List;
import javax.persistence.EntityManager;

/**
 * Class that represents an entity in the system
 *
 * @author jefferson Bello, Jefferson.bello@dce.ufpb.br
 * @version 1.0
 *
 * Copyright (C) 2011 SistComp.
 */
public class VendaDaoImpl implements VendaDao {

    private EntityManager em = HibernateUtil.getInstance().getFactory().createEntityManager();

    /**
     * Método com finalidade de guardar no banco de dados, todas as informações de uma venda.
     * @param venda Objeto do tipo venda que guardar todas as informações de uma venda
     * @throws ErroAoSalvarException Exceção que informa ao cliente que houve um erro ao tentar salvar a venda no banco de dados e apresenta uma possivel solução para solucionar a mesma.
     */
    @Override
    public void cadastrarVenda(Venda venda) throws ErroAoSalvarException {
        try {
            em.getTransaction().begin();
            em.persist(venda);
            em.getTransaction().commit();
            em.close();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new ErroAoSalvarException("Problema ao salvar a venda, favor tente novamente ou contate o administrador do sistema");
        } finally {
            //em.close();
        }
    }

    /**
     * Método com finalidade de remover do banco de dados, uma venda em particular
     * @param venda do tipo Venda, representa o objeto passado por parametro que eu quero retirar do banco de dados
     * @throws ErroAoRemoverException Exceção que informa ao cliente que houve um erro ao tentar remover uma venda no banco de dados e apresenta uma possivel solução para solucionar a mesma.
     */
    @Override
    public void removerVenda(Venda venda) throws ErroAoRemoverException {
        try {
            em.remove(venda.getId());
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new ErroAoRemoverException("Problema ao remover a venda, favor tente novamente ou contate o administrador do sistema");
        } finally {
            em.close();
        }
    }

    /**
     * Método com finalidade de listar as vendas por determinado tipo de pagamento ( A vista, Boleto ou Cartão )
     * @param tipoDePagamento do tipo String que representa o tipo de pagamento escolhido para ser listado.
     * @return retorna uma lista contendo todas as vendas que foram pagas pelo tipo previamente escolhido.
     */
    @Override
    public List<Venda> listarVendas() {
        return em.createQuery("SELECT v FROM Venda v").getResultList();
    }

    /**
     * Método com finalidade de informar qual o lance mais alto de uma venda.
     * @return retorna o lance e todas as suas informações.
     */
    @Override
    public Lance getLanceMaisAlto() {
        return (Lance) em.createQuery("SELECT l FROM Lances l WHERE l.valor = (SELECT max(valor) FROM Lances)").getSingleResult();
    }
}
